home *** CD-ROM | disk | FTP | other *** search
- /**
- Requires
- List.js
- Iterator.js
-
- Common use:
-
- var hashtable = new_hashtable();
- hashtable_put(hashtable, "command", "getit");
- hashtable_put(hashtable, "session", "2");
-
- for (var iterator=hashtable_keys(hashtable); iterator_has_next(iterator); )
- {
- var key = iterator_next(iterator);
- alert(key + "=" + hashtable_get(hashtable, key));
- }
-
- */
-
- var DATA_TYPE = 0;
- var HASHTABLE_KEYS = 1;
- var HASHTABLE_VALUES = 2;
-
- function new_hashtable()
- {
- var hashtable = new Array();
- var keys = new_list();
- var values = new_list();
-
- hashtable[DATA_TYPE] = "hashtable";
- hashtable[HASHTABLE_KEYS] = keys;
- hashtable[HASHTABLE_VALUES] = values;
-
- return hashtable;
- }
-
- function hashtable_put(hashtable, key, value)
- {
- if (hashtable_assert(hashtable, "hashtable_put"))
- {
- for (var i=list_iterator(hashtable[HASHTABLE_KEYS]); iterator_has_next(iterator); )
- {
- if (iterator_next(iterator) == key)
- {
- var old_value = list_get(hashtable[HASHTABLE_VALUES], iterator_previous_index(iterator));
- list_set(hashtable[HASHTABLE_VALUES], iterator_previous_index(iterator), value);
- return old_value;
- }
- }
- list_add(hashtable[HASHTABLE_KEYS], key);
- list_add(hashtable[HASHTABLE_VALUES], value);
- return null;
- }
- }
-
- function hashtable_get(hashtable, key)
- {
- if (hashtable_assert(hashtable, "hashtable_get"))
- {
- for (var i=list_iterator(hashtable[HASHTABLE_KEYS]); iterator_has_next(iterator); )
- {
- if (iterator_next(iterator) == key)
- {
- return list_get(hashtable[HASHTABLE_VALUES], iterator_previous_index(iterator));
- }
- }
- return null;
- }
- else
- {
- return null;
- }
- }
-
- function hashtable_keys(hashtable)
- {
- if (hashtable_assert(hashtable, "hashtable_keys"))
- {
- return list_iterator(hashtable[HASHTABLE_KEYS]);
- }
- else
- {
- return null;
- }
- }
-
- function hashtable_values(hashtable)
- {
- if (hashtable_assert(hashtable, "hashtable_values"))
- {
- iterator = createIterator();
- iterator_add_array(iterator, hashtable[HASHTABLE_VALUES]);
- return iterator;
- }
- else
- {
- return null;
- }
- }
-
- function hashtable_size(hashtable)
- {
- if (hashtable_assert(hashtable, "hashtable_size"))
- {
- return listSize(hashtable[HASHTABLE_KEYS]);
- }
- else
- {
- return -1;
- }
- }
-
- function hashtable_clone(hashtable)
- {
- var clone = new_hashtable();
- for (var i=hashtable_keys(hashtable); iterator_has_next(i); ){
- var key = iterator_next(i);
- var value = hashtable_get(hashtable, key);
- hashtable_put(clone, key, value);
- }
- return clone;
- }
-
- function hashtable_assert(hashtable, functionName)
- {
- var bad = false;
- if (hashtable == null)
- {
- bad = true;
- }
- else
- {
- if (!hashtable.length)
- {
- bad = true;
- }
- else
- {
- if (hashtable.length != 3)
- bad = true;
- }
- }
- if (bad)
- {
- alert("You did not pass an Hashtable to " + functionName + "..causing error to stop js");
-
- var tmp = null;
- alert(tmp.length); // cause an error
- }
-
- return !bad;
- }
-
- function hashtable_encode(hashtable)
- {
- if (hashtable_assert(hashtable, "hashtable_encode"))
- {
- var encoded_hashtable = "";
- for (var i=hashtable_keys(hashtable); iterator_has_next(i); ) {
- var key = iterator_next(i);
- var value = hashtable_get(hashtable, key);
- encoded_hashtable += query_encode(key) + "=" + query_encode(value) + "&";
- }
- return encoded_hashtable;
- }
- }
-
- function hashtable_decode(hashtable_string)
- {
- var hashtable = new_hashtable();
- var delimiter = "&";
- var seperator = "=";
-
- var start_pos = 0;
- for (var pos=hashtable_string.indexOf(delimiter); pos!=-1; pos=hashtable_string.indexOf(delimiter, pos+delimiter.length))
- {
- var name_value = hashtable_string.substring(start_pos, pos);
- var seperator_pos = name_value.indexOf(seperator);
- var key = query_decode(name_value.substring(0, seperator_pos));
- var value = query_decode(name_value.substring(seperator_pos+1));
- hashtable_put(hashtable, key, value);
-
- start_pos = pos+delimiter.length;
- }
- return hashtable;
- }
-
- function is_hashtable(obj)
- {
- if (obj != null) {
- if (typeof(obj) == "object")
- {
- if (obj[DATA_TYPE] == "hashtable") {
- return true;
- }
- }
- }
- return false;
- }
-
-